import { get } from './ajax'
import Axios from 'axios'
import API from './apis'
import { FileSuffix, GetOneFile } from 'yb-tool'

const WAjax = Axios.create({
  timeout: 60000 // 请求超时时间
})

/**
 * 自定义OSS上传对象
 */
class OSS {

  /**
   * 阿里云签名
   * @param file 文件对象
   * @param allowPrefix 允许上传的文件前缀
   * @param prefix 主要用作文件类型识别
   * @returns {Promise<void>}
   */
  static async getALiSign(file, allowPrefix, prefix) {
    const imageSuffix = await FileSuffix(file)
    return await get(API.ali.ossSignature, {
      allowPrefix: allowPrefix,
      prefix,
      random: Math.random(),
      suffix: imageSuffix
    })
  }

  /**
   * 阿里云文件上传
   * @param e 可以是事件对象（获取第一个文件，也可以是文件对象）
   * @param host 上传文件的地址
   * @param allowPrefix 允许上传的文件前缀(文件夹)
   * @param prefix 主要用作文件类型识别
   * @returns {Promise<*>}
   */
  static async aLiFileUp(e, host, allowPrefix, prefix) {
    let file = await GetOneFile(e)
    return new Promise((resolve, reject) => {
      this.getALiSign(file, allowPrefix, prefix).then((data) => {
        const fd = new FormData()
        const { OSSAccessKeyId, policy, signature, startsWith, saveName } = data
        fd.append('OSSAccessKeyId', OSSAccessKeyId)
        fd.append('policy', policy)
        fd.append('signature', signature)
        fd.append('key', `${startsWith}${saveName}`)
        fd.append('success_action_status', 200)
        fd.append('file', file, saveName)
        WAjax.post(host, fd, {
          headers: {
            'Content-Type': 'multipart/form-data'
          }
        }).then(() => {
          resolve(`${host}${allowPrefix}${saveName}`)
        }).catch((e) => {
          reject(e)
        })
      }).catch((e) => {
        reject(e)
      })
    })
  }
}

export default OSS
